package com.anttribe.components.db.metadata.entity;

import lombok.Getter;
import lombok.Setter;
import lombok.ToString;

/**
 * 数据列
 *
 * @author zhaoyong
 * @date 2020-12-13
 */
@Getter
@Setter
@ToString
public class DbColumn {

    /**
     * 列名
     */
    private String columnName;

    /**
     * 注释说明
     */
    private String comment;

    /**
     * 是否为主键
     */
    private boolean primaryKey = false;

    /**
     * 值能否为空, 默认允许
     */
    private boolean nullable = true;

    /**
     * jdbc数据类型
     */
    private JdbcType jdbcType;

    /**
     * 数据类型
     */
    private String dataType;

    /**
     * 长度
     */
    private int size;

    /**
     * 精度
     */
    private int precision;

    /**
     * 小数位
     */
    private int digits;

    /**
     * 默认值
     */
    private String defaultVal;

    /**
     * 序数
     */
    private int ordinal;

    /**
     * 数据类型
     *
     * @return String
     */
    public String getDataType() {
        StringBuilder dataTypeStrB = new StringBuilder();
        JdbcType jdbcType = this.getJdbcType();
        if (null != jdbcType) {
            dataTypeStrB.append(jdbcType.name());
            switch (jdbcType) {
                case BIGINT:
                case SMALLINT:
                case TINYINT:
                case INTEGER:
                    precision = precision != 0 ? precision : jdbcType.getPrecision();
                    if (precision != 0) {
                        dataTypeStrB.append("(").append(precision).append(")");
                    }
                    break;
                case FLOAT:
                case DOUBLE:
                case DECIMAL:
                    precision = precision != 0 ? precision : jdbcType.getPrecision();
                    digits = digits != 0 ? digits : jdbcType.getDigits();
                    if (precision != 0) {
                        dataTypeStrB.append("(").append(precision);
                        if (digits != 0) {
                            dataTypeStrB.append(",").append(digits);
                        }
                        dataTypeStrB.append(")");
                    }
                    break;
                case CHAR:
                case VARCHAR:
                case VARCHAR2:
                    size = size != 0 ? size : jdbcType.getSize();
                    if (size != 0) {
                        dataTypeStrB.append("(").append(size).append(")");
                    }
                    break;
                default:
                    break;
            }
        }

        return dataTypeStrB.toString();
    }

}
